原文連結:Working with Structured Data Objects
要選取structure底下的欄位元件,以左右不帶空格的-
來指定元件,語法上為<structure名稱>-<欄位名稱>
。
這種寫法可以讓structure底下的欄位像普通變數般被賦值或呼叫,或在SQL SELECT的INTO及WHERE中使用。
*建立structure型別
TYPES: BEGIN OF st_connection_nested,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id TYPE /dmo/airport_to_id,
message TYPE symsg,
carrier_name TYPE /dmo/carrier_name,
END OF st_connection_nested.
*建立structure
DATA connection TYPE st_connection.
*為structure的特定欄位賦值
connection-airport_from_id = 'ABC'.
connection-airport_to_id = 'XYZ'.
connection-carrier_name = 'My Airline'.
如果該structure是個巢狀structure,一樣使用不帶空格的-
來指定下層元件,如CONNECTION_NESTED-message-msgty
。
*建立巢狀structure型別
*子structure 參照 symsg
TYPES: BEGIN OF st_connection_nested,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id TYPE /dmo/airport_to_id,
message TYPE symsg,
carrier_name TYPE /dmo/carrier_name,
END OF st_connection_nested.
*建立巢狀structure
DATA connection_nested TYPE st_Connection_nested.
*為巢狀structure的欄位賦值
connection_nested-message-msgty = 'E'.
connection_nested-message-msgid = 'ABC'.
connection_nested-message-msgno = '123'.
除了用前述範例賦值,也可以使用VALUE #( )
表達式為structure賦值。井字號#
於ABAP執行時可以建構一個和賦值目標型別相同的structure,並在括號內為欄位賦值,在這裡不一定要一口氣為所有structure下的欄位賦值。
*使用前一個例子裡的巢狀structure
connection_nested = VALUE #( airport_from_id = 'ABC'
airport_to_id = 'XYZ'
message = VALUE #( msgty = 'E'
msgid = 'ABC'
msgno = '123' )
carrier_name = 'My Airline'
).
注意,使用這種方式賦值將會刪去該structure原本的現有值,再以表達式中的值重新填入。
當兩個structure的型別結構相容,可以直接把structureA賦值給structureB,但如果型別不同,將可能導致兩種結果:
DATA connection TYPE st_connection.
DATA connection_nested TYPE st_Connection_nested.
connection_nested = connection."!!可能產生error!!"
在上圖範例中,兩個structure雖然都有carrier_name這欄,但carrier_name的內容被錯誤的劃分進了message欄位中。且這類錯誤不會有error log,所以要特別小心。
為了應付上面欄位沒有對應好的狀況,可以用表達式CORRESPONDING
依照同名欄位自動對應賦值,有以下幾個要點:
寫法如下:
DATA connection TYPE st_connection.
DATA connection_nested TYPE st_Connection_nested.
connection_nested = CORRESPONDING #( connection )."同名欄位自動對應賦值"
了解如何為structure賦值後,明天接著介紹structure如何與SQL一起使用~